import numpy as np
import scipy.sparse as sp
from scipy.sparse.linalg import spsolve
import os

def MFEABernoulli3Ddata(filename):
    Node = []#（定义六个空列表，节点）
    Element = []#（单元）
    Material = []#（材料）
    Load = []#（载荷）
    Constr = []#（约束）
    DF = []#（自由度）

    isNodeSection = False#（布尔操作跟踪状态）
    isElementSection = False
    isMaterialSection = False
    isLoadSection = False
    isDFSection = False
    isConstrSection = False

    with open(os.path.join("input", f"{filename}.txt"), 'r') as fid:#（）
        for line in fid:#（文件中的每一行，line会依次被赋予文件的每一行内容）
            line = line.strip()#（ strip() 方法移除 line 字符串两端的空白字符，包括空格、制表符、换行符等）
            if not line:#（如果line为空字符，则结束当前循环，进入下一次循环）
                continue#（结束当前循环，返回上一级循环进入下一次循环）

            if line.startswith('*Node'):#（检查行以特定标记开始，*Node，并将响应的布尔设置为True）
                isNodeSection = True
                isElementSection = False
                isLoadSection = False
                isConstrSection = False
                isDFSection = False
                isMaterialSection = False
                continue#（结束当前循环，返回上一级循环进入下一次循环）
            elif line.startswith('*Element'):#（检查行以特定标记开始，*Element，并将响应的布尔设置为True）
                isNodeSection = False
                isElementSection = True
                isLoadSection = False
                isConstrSection = False
                isDFSection = False
                isMaterialSection = False
                continue#（结束当前循环，返回上一级循环进入下一次循环）
            elif line.startswith('*Material'):#（检查行以特定标记开始，*Material，并将响应的布尔设置为True）
                isNodeSection = False
                isElementSection = False
                isLoadSection = False
                isConstrSection = False
                isDFSection = False
                isMaterialSection = True
                continue#（结束当前循环，返回上一级循环进入下一次循环）
            elif line.startswith('*Load'):#（检查行以特定标记开始，*Load，并将响应的布尔设置为True）
                isNodeSection = False
                isElementSection = False
                isLoadSection = True
                isConstrSection = False
                isDFSection = False
                isMaterialSection = False
                continue#（结束当前循环，返回上一级循环进入下一次循环）
            elif line.startswith('*DF'):#（检查行以特定标记开始，*DF，并将响应的布尔设置为True）
                isNodeSection = False
                isElementSection = False
                isLoadSection = False
                isDFSection = True
                isConstrSection = False
                isMaterialSection = False
                continue#（结束当前循环，返回上一级循环进入下一次循环）
            elif line.startswith('*Constr'):#（检查行以特定标记开始，*Constr，并将响应的布尔设置为True）
                isNodeSection = False
                isElementSection = False
                isLoadSection = False
                isConstrSection = True
                isDFSection = False
                isMaterialSection = False
                continue#（结束当前循环，返回上一级循环进入下一次循环）

            if isNodeSection:
                data = list(map(float, line.split(',')))#（将当前line根据逗号分割成多个子字符串；map将字符串转为float；list将其转换为列表）
                if len(data) >= 4:#（如果data长度至少为4，第一个数是节点编号，之后是x、y、z坐标值）
                    Node.append(data[1:])#（将data从第2个到最后的数据加到Node列表末尾）
            elif isElementSection:
                data = list(map(int, line.split(',')))
                if len(data) >= 3:#（如果data长度至少为3，第一个数是单元编号，之后是单元的节点编号）
                    Element.append(data[1:])#（将data数据从第2个到最后的数据加到Element列表末尾）
            elif isMaterialSection:
                data = list(map(float, line.split(',')))
                if len(data) >= 6:
                    Material.append(data[:6])#（将data数据中从0到5的数据加到material列表末尾）
            elif isLoadSection:
                data = list(map(float, line.split(',')))
                if len(data) >= 3:
                    Load.append([int(data[0]), int(data[1]), data[2]])#（data0、1为整数（节点编号和载荷方向编号），data2为浮点数（载荷大小））
            elif isDFSection:
                data = list(map(float, line.split(',')))
                if len(data) >= 4:
                    DF.append(data)
            elif isConstrSection:
                data = list(map(float, line.split(',')))
                if len(data) >= 3:
                    Constr.append([int(data[0]), int(data[1]), data[2]])#（data0、1为整数（约束作用的节点编号和约束的自由度编号）浮点数为约束的值）

    return np.array(Node), np.array(Element), np.array(Material), np.array(Load), np.array(Constr)
print(Node,)